#pragma once

#include <compl.h>
/* 基础定义 */
/* 用户指针 */
typedef void uvoid;
typedef struct mreq {
	union{
		size_t	usize;	/* usable 大小 */
		size_t	size;  /* 真实大小 */
	};
	uvoid	*ptr;	/* 申请或者释放指针 */
	// #ifdef MREQ_USE_MULTIREQ
	uvoid	*sptr;	/* 第二指针，可用作批量申请/释放时的尾指针*/
	size_t	nr;	/* 批量申请/释放数量 */
	// #endif
	void	*tls;	/* tls结构体指针 需要一开始就设置吗? 其实可以到用的时候再访问环境状态, 不用不访问 */
	union{
		size_t	align;	/* 申请时用于对称 */
		struct{
			hword_t	cls; /* 释放时可用于记录cls */
			hword_t extra_info;
		};
	};
} mreq_t;

typedef size_t	(lsizeof)(mreq_t *req);
typedef void	*(lalloc)(mreq_t *req);
typedef bool_t	(lfree)(mreq_t *req);

typedef const struct{
	lsizeof	*lsizeof;
	lalloc	*lalloc;
	lfree	*lfree;
	size_t	lidx;
	size_t	lmaxsize; /* 该层管理的最大大小 */
} mlfunc_t;
SAI void _mreq_setalloc(mreq_t *req, size_t size, size_t alignment, void *tls){
	req->size = size;
	req->ptr = NULL_PTR;
	
	req->sptr = NULL_PTR;
	req->nr = 1;

	req->tls = tls;
	req->align = alignment;
}
SAI void mreq_setalloc(mreq_t *req, size_t size, size_t alignment){
	_mreq_setalloc(req, size, alignment, NULL_PTR);
}

SAI void mreq_setfree(mreq_t *req, void *ptr, size_t size){
	req->size = size;
	req->ptr = ptr;
	req->sptr = ptr;
	req->nr = 1;
	req->tls = NULL_PTR; 
}
